﻿/**
 *
 * @file InpKeyWordsChecker.h
 * @brief 关键字检查器声明
 * @author LiBaojun (libaojunqd@foxmail.com)
 * @date 2024-03-19
 *
 */
#ifndef __INPKEYLINECHECKER_H___
#define __INPKEYLINECHECKER_H___

#include <QString>
#include <QStringList>
#include <QHash>

class QSettings;

namespace IO
{
    class FITKAbaqusINPReader;

    /**
     * @brief 关键字检查器
     * @author LiBaojun (libaojunqd@foxmail.com)
     * @date 2024-03-19
     */
    class InpKeyWordsChecker
    {
    public:
        /**
         * @brief Construct a new Inp Key Words Checker object
         * @param[i]  reader         读取器
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        explicit InpKeyWordsChecker(FITKAbaqusINPReader* reader);
        virtual ~InpKeyWordsChecker();

        /**
         * @brief  检查器关键字
         * @param[i]  header         关键字行头
         * @param[i]  keys           关键字
         * @param[i]  keyValues      关键字的值
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool check(const QString& header, const QStringList& keys, const QHash<QString, QString>& keyValues);

    private:
        /**
         * @brief 检查行头
         * @param[i]  header         行头
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool checkHeader(const QString& header);
        /**
         * @brief 检查关键字
         * @param[i]  keys           关键字
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool checkKeys(const QStringList& keys);
        /**
         * @brief 检查值
         * @param[i]  keyValues      检查关键字值
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool checkValues(const QHash<QString, QString>& keyValues);
        /**
         * @brief 检查是否为数字
         * @param[i]  value     待检查的值
         * @param[i]  supports  支持的关键字
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool checkNums(QString value, QStringList supports);
        /**
         * @brief 检查是否为double数字
         * @param[i]  value     待检查的值
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool isDoubleValue(QString value);
        /**
         * @brief 检查是否为Int数字
         * @param[i]  value     待检查的值
         * @return true
         * @return false
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        bool isIntValue(QString value);
        /**
         * @brief 报告不支持的关键字
         * @param[i]  key            不支持的关键字
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        void unknownKeyWords(const QString& key );

        

    private:
        /**
         * @brief 读取器
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        FITKAbaqusINPReader* _reader{};
        /**
         * @brief 配置文件信息
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        QSettings* _settings{};
        /**
         * @brief 全部分组
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        QStringList _allgroups{};
        /**
         * @brief 行头
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        QString _header{};
        /**
         * @brief 关键字
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        QStringList _keys{};
        /**
         * @brief 关键字的值
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-19
         */
        QHash<QString, QString> _keyValues{};

    };
}

#endif // !__INPKEYLINECHECKER_H___
